A typical operating system includes a file system. The file system provides a mechanism for the storage and retrieval of files and a hierarchical directory structure for the naming of multiple files. More specifically, the file system stores information provided by the user (i.e., data) and information describing the characteristics of the data (i.e., metadata). The file system also provides extensive programming interfaces to enable the creation and deletion of files, reading, and writing of files, performing seeks within a file, creating and deleting directories, managing directory contents, etc. In addition, the file system also provides management interfaces to create and delete file systems. File systems are typically controlled and restricted by operating system parameters. For example, most operating systems limit the maximum number of file names that can be handled within their file system. Some operating systems also limit the size of files that can be managed under a file system.
To access a file, the operating system (via the file system) typically provides file manipulation interfaces to open, close, read, and write the data within each file. An application, which may reside on the local system (i.e., computer) or may be located on a remote system, uses files as an abstraction to address data. Conventionally, this data is stored on a storage device, such as a disk. The file system stores data on the storage device by managing the allocation of space within the storage device.
Typically, the volume manager provides space which is managed by the file system. Two common types of file system space allocation strategies are known as block-based allocation and extent-based allocation. Block-based allocation creates incremental disk space for each file each time the file is extended (i.e., modified via a write request to add information), whereas extent-based allocation creates a large series of contiguous blocks (i.e., extents) each time the file exhausts the space available in the file's last extent.
When allocating space, both block-based and extent-based allocation use space provided by the volume manager. The volume manager allows multiple physical disks to be used as a single volume (i.e., a virtual disk) to provide larger consolidated storage sizes and simpler management. The volume manager allows users to organize data along volume boundaries (i.e., each volume has physical disk space allocated to the volume such that the volume is tied only to that dedicated physical disk). The volume manager is typically implemented as a separate layer between the physical disks and the file system, and is presented to the user as a virtual disk device. In other words, volume managers organize the collections of physical devices (e.g., disks) into virtual devices. Additionally, the space allocated within the volume manager is handled by the file system. Consequently, the volume manager is not aware of which blocks within the available storage space are in use and which blocks are free for data to be stored.
Further, file systems may be mounted on the virtual disk devices. Thus, physical disks are partitioned and allocated to multiple virtual disk devices, and each virtual disk device is capable of having a file system that exclusively uses that particular virtual disk device. A request to access a file is typically performed by an application, via the file system, using a file name and logical offset. This file name and logical offset (i.e., the manner in which applications express file operation requests) corresponds to a location within the virtual disk device. Subsequently, the request is translated to physical disk space on the storage device by the volume manager, allowing the user of the application to access the data within a particular file.
The speed of the processor associated with a particular file system is typically orders of magnitude faster than accessing physical disk space. A common method of reducing the bottleneck resulting from disparity in execution time is to use processor speed to optimize physical disk access.
An array of independent disks (e.g., Redundant Array of Independent Disks (RAID)) is a common data storage system utilized to improve system performance. With multiple physical disks organized in an array, separate input/output (I/O) requests can be handled in parallel, provided that the data for each request resides on a separate disk. The physical disks in the data storage system are typically segmented into blocks of data space. A block may include any appropriate number of bytes of data (e.g., 512 bytes, 1024 bytes, etc.).
The concept of data striping is fundamental to improving performance of physical disk access when using an array of physical disks. Data striping involves spreading blocks across multiple physical disks. The blocks may be interleaved in a round-robin fashion, so that the combined space is composed alternately of blocks from each disk. The stripe unit (i.e., the number of blocks stored in an I/O request) may be as small as one sector (i.e., 512 bytes) or as large as several megabytes. The stripe width corresponding to the number of physical disks on which blocks are stored. For example, in a five disk array, the first five logical blocks are stored as the first physical blocks on each of the five disks (e.g., at offset zero in each of the five physical disks), forming a stripe across all the physical disks. Similarly, the next five logical blocks may be stored at offset one of each of the five physical disks, etc. In this example, the stripe width of each data stripe is a fixed stripe width of five data blocks, and the stripe unit is one block.
Using the aforementioned method, striping data across multiple physical disks results in the physical location of data being a function of the number of physical disks (i.e., the stripe width of each stripe of data is dependent on the number of disks). Therefore, in general, to retrieve data stored using data striping, the nth data block maps to disk n mod d (i.e., n % d), where d is the number of physical disks in the volume. The result of the calculation n divided by d (i.e., n/d) points to the correct offset within the disk where the data of block n is located. Because of the aforementioned mathematical relationships, adding or deleting physical disks causes the location of blocks to become invalid.